from enum import Enum
import os


class EmotionType(Enum):
    """
    情感枚举类
    """
    CALM = "平静"
    HAPPY = "开心"
    ANGRY = "生气"
    QUESTIONING = "疑问"

    @staticmethod
    def Analysis(text: str) -> 'EmotionType':
        """
        功能：根据文本内容分析情感
        输入：
            text 文本字符串
        输出：
            EmotionType 情感类型
        """
        if '?' in text or '？' in text:
            return EmotionType.QUESTIONING
        elif '!' in text or '！' in text:
            return EmotionType.ANGRY
        else:
            return EmotionType.CALM


class Emotion:
    """
    情感数据类型
    描述情感及其对应的参考语音与参考文本
    成员：
    type 情感类型 EmotionType 枚举类型
    refWav 参考音频路径
    refText 参考音频文本
    """

    def __init__(self, ref_file_path):
        # 从 ref_file_path 提取文件名（不包括文件后缀）
        file_name = os.path.splitext(os.path.basename(ref_file_path))[0]

        # file_name 中第一个 '-' 前的字符串作为 emotion
        emotion = file_name.split('-')[0] if '-' in file_name else file_name
        # 使用枚举类验证 emotion
        if emotion in EmotionType._value2member_map_:
            self.type = EmotionType(emotion).value
        else:
            raise ValueError(
                f"【{self.__class__.__name__}】Invalid emotion: {emotion}. Must be one of {list(EmotionType._value2member_map_.keys())}")

        self.type = EmotionType(emotion)

        self.refWav = ref_file_path

        # file_name 中第一个 '-' 后的字符串作为 text
        self.refText = file_name.split('-', 1)[1] if '-' in file_name else ""

    def __repr__(self):
        return f"【Emotion情感信息】(【情感类型】={self.type}, 【参考音频路径】={self.refWav}, 【参考文本】={self.refText})\n"


class Dialog:
    """
    对话数据结构
    成员：
        roleName 角色名 字符串
        title 头衔 字符串
        emotion EmotionType 枚举类型情感
        speachContent 对话内容 字符串
    """

    def __init__(self, role_name: str, title: str, emotion: EmotionType, content: list[str]):
        """
        role 角色名字符串
        content 角色讲话内容
        """
        self.roleName = role_name
        self.title = title
        self.emotion = emotion
        self.speachContent = content

    def __repr__(self):
        return f"【对话文本DialogText】(【角色名】={self.roleName}, 【角色头衔】={self.title}, 【讲话情感】={self.emotion.value},【讲话内容】={self.speachContent})\n"


class GameType(Enum):
    """
    定义游戏名枚举
    """
    GENSHIN_IMPACT = "原神"
    STAR_RAIL = "星铁"

    def __str__(self):
        """
        为实现枚举类型与字符串相加
        """
        return self.value


class ScreenType(Enum):
    """
    屏幕分辨率枚举类型
    """
    S_1080P = "1920*1080"
    S_2K = "2560*1440"
    S_4K = "3840*2160"


class VersionType(Enum):
    """
    GPT-SoVITS 模型版本枚举类
    """
    V1 = "v1",
    V2 = "v2"


class DeviceType(Enum):
    """
    硬件平台类型枚举类
    """
    GPU = "cuda",
    CPU = "cpu"
